﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI.WebControls;
using System.Web.Services;
using Web.Extensions;
using Web.Helpers;
using Common;
using Controladores;
using Entidades;
using Entidades.jSON.Sistema;
using Entidades.jSON;
using Web.Helpers.Documents.Spreadsheets.Enums;

namespace Web.Pages
{
    public partial class PlanillaDePagoStaff : BasePage
    {
        #region Events

        protected new void Page_Load(object sender, EventArgs e)
        {
            base.Page_Load(sender, e);

            if (!Page.IsPostBack)
            {
                this.CargarPagina();

                var idsPagos = WebHelper.Pages.QueryString.GetParameter("idsPagos");
                if (idsPagos.IsNotNull())
                {
                    #region Items

                    var listaIdPagos = idsPagos.Split(',').Select(x => Convert.ToInt32(x)).ToArray();
                    var pagos = this.ObtenerPagos(listaIdPagos);

                    var primerPago = new ControladorBase<Pago>().ObtenerEntidad(x => x.Id == listaIdPagos.First());
                    if (primerPago.IsNotNull())
                    {
                        #region Seleccionar Proyecto
                        var proyecto = primerPago.Guion.Proyecto;
                        this.txtPlanilla_Programa_Titulo.Value = proyecto.Nombre;
                        this.selPlanilla_Proyecto.SetSelected(proyecto.Id);
                        #endregion

                        #region Cargar Guiones y Seleccionar los correspondientes
                        var guionesInfo = new List<ListaInfo>();
                        var guiones = new GuionControlador().ObtenerGuionesPendientesDePago(proyecto.Id, null, WellKnownKeys.Entities.CategoriasUsuario.FREELANCE.Id, null, WellKnownKeys.Entities.TiposUsuario.ACTOR.Id);
                        if (guiones.IsNotNull())
                        {
                            guionesInfo.AddRange(
                                guiones.Select(
                                    guion =>
                                        new ListaInfo()
                                        {
                                            Id = guion.Id,
                                            Texto = String.Format("Ep. {0} - {1}", guion.Episodio, guion.Titulo)
                                        }));
                            this.selPlanilla_Guion.Bind(guionesInfo, "Id", "Texto");
                        }
                        foreach (var pago in pagos)
                        {
                            this.selPlanilla_Guion.SetSelected(pago.Guion.Id);
                        }
                        #endregion
                    }

                    this.rptPlanillaItems.DataSource = pagos;
                    this.rptPlanillaItems.DataBind();

                    var tiposDocumento = TiposDocumento.ObtenerTodos().ToList();
                    this.selPlanilla_TipoDocumento.Bind(tiposDocumento, "Id", "Texto");

                    ////TO-DO: habría que lograr meter esto en caché
                    //var usuariosActores = Usuarios.ObtenerTodos();
                    //    usuariosActores = usuariosActores.Where(x => ((UsuarioInfo)x.Valor).IdTipo == Common.WellKnownKeys.Entities.TiposUsuario.ACTOR.Id).ToList();
                    //this.selPlanilla_Usuario.Bind(usuariosActores, "Id", "Texto");

                    #endregion Items
                }

                this.hdnPayRollDirectory.Value = PlanillasHelper.ObtenerDirectorioPlanilla(TiposPlanilla.Staff);
            }
        }

        protected void rptPlanillaItems_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
        }

        #endregion

        #region Private Methods

        private void CargarPagina()
        {
            var proyectos = new ProyectoControlador().ObtenerProyectosPendientesDePago(true, null, WellKnownKeys.Entities.CategoriasUsuario.FREELANCE.Id, WellKnownKeys.Entities.TiposUsuario.ACTOR.Id);
            this.selPlanilla_Proyecto.Bind(proyectos, "Id", "Nombre");

            var mediosPago = MediosPago.ObtenerTodos();
            this.selPlanilla_MediosPago.Bind(mediosPago, "Id", "Texto");

            var usuariosInfo = Usuarios.ObtenerTodos();
                usuariosInfo =
                usuariosInfo.Where(
                    x =>
                        ((UsuarioInfo) (x.Valor)).IdTipo != WellKnownKeys.Entities.TiposUsuario.ACTOR.Id &&
                        ((UsuarioInfo) (x.Valor)).IdCategoria == WellKnownKeys.Entities.CategoriasUsuario.FREELANCE.Id)
                    .ToList();
            this.selPlanilla_Usuario.Bind(usuariosInfo, "Id", "Texto");

            var tiposDocumento = TiposDocumento.ObtenerTodos();
            this.selPlanilla_TipoDocumento.Bind(tiposDocumento, "Id", "Texto");

            var tiposUsuario = TiposUsuario.ObtenerTodos();
            var idsTipoUsuario = new int[]
            {
                WellKnownKeys.Entities.TiposUsuario.ADMINISTRADOR.Id,
                WellKnownKeys.Entities.TiposUsuario.PRODUCCION.Id,
                WellKnownKeys.Entities.TiposUsuario.ACTOR.Id
            };
                tiposUsuario = tiposUsuario.Where(x => !idsTipoUsuario.Contains(x.Id)).ToList();
            this.selPlanilla_TipoUsuario.Bind(tiposUsuario, "Id", "Texto");
        }

        private IEnumerable<Pago> ObtenerPagos(int[] idsPagos)
        {
            IList<Pago> pagos = null;
            try
            {
                // Restringir la lista de Pagos seleccionada a sólo aquellos Pagos que correspondan a Staff (no Actores) Freelance.
                pagos = new PagoControlador().ObtenerPagosSegunListaDePagos
                        (
                            idsPagos,
                            WellKnownKeys.Entities.EstadosPago.PENDIENTE_DE_PAGO.Id,
                            null,
                            WellKnownKeys.Entities.CategoriasUsuario.FREELANCE.Id,
                            WellKnownKeys.Entities.TiposUsuario.ACTOR.Id,
                            null
                        );
            }
            catch (Exception)
            {
                throw;
            }
            return pagos;
        }

        #endregion

        #region Web Methods

        /// <summary>
        /// Devuelve una lista de los ítems de la Planilla de Pago, según una lista de Guiones
        /// </summary>
        /// <param name="idsGuiones"></param>
        /// <returns></returns>
        [WebMethod]
        public static string obtenerPagosDeGuiones(int[] idsGuiones)
        {
            var mensaje = string.Empty;
            var resultado = false;
            object valor = null;
            try
            {
                var pagosInfo = new List<PagoInfo>();
                var pagos = new PagoControlador().ObtenerPagos(idsGuiones, WellKnownKeys.Entities.EstadosPago.PENDIENTE_DE_PAGO.Id, null, WellKnownKeys.Entities.CategoriasUsuario.FREELANCE.Id);
                if (pagos.IsNotNull())
                {
                    pagos = pagos.Where(x => x.ProveedorRol.Id != WellKnownKeys.Entities.TiposUsuario.ACTOR.Id).ToList();
                    pagosInfo.AddRange(pagos.Select(pago => new PagoInfo(pago)));
                    valor = pagosInfo;
                    resultado = true;
                }
                else
                {
                    mensaje = "No se han podido obtener el Detalle de la Planilla de Pago.";
                    resultado = false;
                }
            }
            catch (Exception ex)
            {
                //throw ex;
                LogError(ex);
                mensaje = "Hubo un error al intentar obtener el Detalle de la Planilla de Pago." + Environment.NewLine + ex.Message;
            }
            return SessionHelper.BuildResponse(mensaje, resultado, valor);
        }

        #endregion
    }
}